Ana içeriğe geç

Agoric Akıllı Kontratlarında Birleşebilirlik

Agoric akıllı sözleşmeleri, "composable" yani "bileşebilir" niteliktedir. Bu, Agoric'in hedeflerinden biridir ve belirli bir amaca yönelik olarak tasarlanmış önceden hazırlanmış modüllerin kullanımını teşvik eder.

Agoric smart contracts, bileşenler arasında daha kolay bir şekilde etkileşim sağlamak için iki ana fikir üzerine inşa edilmiştir: Zoe ve SwingSet.

Zoe, Agoric'te sunulan bir kontrat geçidi (contract gateway) olarak hizmet verir ve iki tarafa dokunulmazlık (escrow) yöntemini kullanarak güvenli bir şekilde sözleşme yapmalarına izin verir. Bu, tarafların birbirlerine güvenmedikleri durumlarda bile anlaşmaya varmalarına olanak tanır.

SwingSet, Agoric'in sanal makinesi olarak hizmet verir ve akıllı sözleşmelerin diğer akıllı sözleşmelerle etkileşime girmesine olanak tanır. SwingSet, her sözleşmenin kendi bağımsız çalışma ortamını (isolation environment) oluşturmasına izin verir, böylece bir sözleşmedeki bir hata diğer sözleşmeleri etkilemez.

Agoric smart contracts'ın kompozisyonelliği, şu avantajları sağlar:

  1. Modülerlik: Sözleşmelerin daha küçük, önceden hazırlanmış modüllere ayrılması, yeniden kullanımı ve değiştirilebilirliği kolaylaştırır.
  2. Güvenlik: Zoe'nin dokunulmazlık yöntemi, tarafların güvensiz bir ortamda bile anlaşmalar yapmasına olanak tanırken, SwingSet'in her sözleşmenin kendi bağımsız çalışma ortamını oluşturması, güvenlik risklerini en aza indirir.
  3. Esneklik: Akıllı sözleşmelerin kompozisyonelliği, farklı sözleşmeler arasında etkileşim sağlayarak daha karmaşık uygulamaların oluşturulmasına olanak tanır.

Agoric smart contracts bileşebilirliği konusunda önemli bir adım atmıştır ve diğer blockchain platformlarına da bu konuda ilham vermiştir.

Şimd bu özelliği kullanan iki örnek verelim:

  1. Bir DeFi uygulaması:

Agoric smart contracts'in kompozisyonel yapısı, DeFi uygulamalarının geliştirilmesinde oldukça yararlıdır. Örneğin, bir merkezi olmayan borç verme platformu, birden fazla akıllı sözleşmeyi bir araya getirebilir. Bu sözleşmelerden biri, borç verenlerin fonlarını yönetirken, diğer sözleşme, borç alanların kredilerini yönetir.

// Kod örneği sadece fikir vermek amacıyla yazılmıştır ve gerçek dünya senaryolarına uyarlanmadan önce daha fazla test edilmelidir.

import { Far } from '@agoric/marshal';
import { makeIssuerKit, AssetKind } from '@agoric/ertp';
import { E } from '@agoric/eventual-send';
import { makeZoe } from '@agoric/zoe';

const start = async (zcf) => {
const { mint, issuer } = makeIssuerKit('Token', AssetKind.SET);
const zoe = makeZoe();

const tokens = await E(mint).mintGains({ Foo: 1000 });
const { creatorInvitation } = await zoe.startInstance(
zcf,
{
give: { Token: tokens },
want: { Price: 10 },
}
);
const sellerOfferHandle = await E(zoe).offer(
creatorInvitation,
{
give: { Price: 50 },
want: { Token: tokens.withoutAmount('Foo') },
}
);

// Alıcı teklif oluşturur
const { publicFacet: salePublicFacet } = await zoe.getInstanceRecord(
creatorInvitation.getProposal().instanceHandle
);
const { invite: buyerInvite } = await salePublicFacet.makeBuyerInvitation();

// Alıcı teklif verir
const buyerOfferHandle = await E(zoe).offer(
buyerInvite,
{
want: { Price: 50 },
give: { Token: tokens.withoutAmount('Foo') },
}
);

// İşlem tamamlanır ve token'lar alıcıya transfer edilir
await E(zoe).getOfferResult(buyerOfferHandle);
const buyerTokenPurse = await E(salePublicFacet).getBuyerTokenPurse();
await E(tokens).move(buyerTokenPurse, tokens.withoutAmount('Foo'));
};

// Test amaçlı olarak başlatma fonksiyonunu çağırıyoruz
start();

Bu örnek Agoric smart contracts kullanarak bir DeFi uygulaması göstermektedir. Bu kod, Agoric'te oluşturulan iki tür varlık arasındaki takas işlemini gerçekleştirir. Uygulama bu şekilde çalışır:

  1. IssuerKit, Token adlı bir mint (para basım) ve issuer (para satışı) tanımlar.
  2. Zoe, bir akıllı sözleşme yönetim sistemi sağlar.
  3. Başlangıçta, Token tarafından desteklenen bir miktar Foo token'ı mint edilir ve Zoe'nin startInstance() metodu kullanılarak bir Zoe örneği başlatılır.
  4. Bir satıcı (seller) teklif verir ve Zoe'nin offer() metodu kullanılarak satıcı teklifi işleme sokulur.
  5. Bir alıcı (buyer) teklif verir ve Zoe'nin offer() metodu kullanılarak alıcı teklifi işleme sokulur.
  6. Son olarak, işlem tamamlanır ve Token'lar alıcıya transfer edilir.

Bu örnekte görüldüğü gibi, Agoric smart contracts, JavaScript kullanarak kompozisyonel bir yapıda yazılabilir. Bu sayede, farklı akıllı sözleşmeleri bir araya getirerek daha karmaşık DeFi uygulamaları oluşturabiliriz.

  1. Bir oyun platformu:

Agoric smart contracts, oyun platformları için de idealdir. Birden fazla oyuncunun aynı anda etkileşime girdiği bir çevrimiçi oyun, birden fazla akıllı sözleşmenin bir araya gelmesini gerektirir. Örneğin, bir satranç oyununu ele alalım. Her hamle, bir akıllı sözleşme tarafından işlenir ve sonucu belirleyen bir diğer sözleşme tarafından onaylanır. Oyuncuların, hesap bakiyeleriyle ilgili bilgiler, başka bir sözleşme tarafından yönetilir. Tüm bu bileşenlerin bir arada çalışması nedeniyle çevrimiçi bir satranç oyunu, Agoric smart contracts bileşebilirliği kullanılarak başarıyla inşa edilebilir.

Bu örnekler, Agoric smart contracts'in bileşebilirliğinin ne kadar yararlı olduğunu göstermektedir. Bu yapı sayesinde, geliştiriciler, farklı işlevleri bir araya getirerek daha karmaşık uygulamalar oluşturabilir ve sözleşmeleri yeniden kullanabilme yeteneği sayesinde zaman ve kaynak tasarrufu sağlayabilirler.

// Kod örneği sadece fikir vermek amacıyla yazılmıştır ve gerçek dünya senaryolarına uyarlanmadan önce daha fazla test edilmelidir.

import { Far } from '@agoric/marshal';
import { makeZoe } from '@agoric/zoe';

// Oyuncu verileri
const players = [
{ name: 'Alice', score: 0 },
{ name: 'Bob', score: 0 }
];

// Skor yönetimi için akıllı sözleşme
const scoreContract = async (zcf) => {
let scores = {};

// Skor ekleme fonksiyonu
const addScore = (player, amount) => {
if (scores[player]) {
scores[player] += amount;
} else {
scores[player] = amount;
}
};

// Skorları getirme fonksiyonu
const getScores = () => {
return scores;
};

// Creator facet tarafından çağrılacak fonksiyonlar
return Far('scorekeeper', {
addScore,
getScores
});
};

// Oyun yönetimi için akıllı sözleşme
const gameContract = async (zcf) => {
const zoe = makeZoe();

// Oyuncuların kaydı
const playerInvites = await Promise.all(players.map(player => {
return zoe.makeInstance(zcf, { give: {}, want: {} });
}));

// Oyuncuların kabul edilmesi
const playersSeats = await Promise.all(playerInvites.map(invite => {
return invite.accept();
}));

// Skor yönetimi sözleşmesinin oluşturulması
const scorekeeperInstallationHandle = await zoe.install(scoreContract);
const scorekeeperInvite = await zoe.makeInstance(scorekeeperInstallationHandle);
const scorekeeperSeat = await scorekeeperInvite.accept();
const scorekeeperFacet = await E(scorekeeperSeat).getCreatorFacet();

// Oyunun başlaması
console.log("Oyun başlıyor!");

// Oyun döngüsü
while (true) {
// Rastgele bir oyuncu seçilir
const currentPlayerIndex = Math.floor(Math.random() * players.length);
const currentPlayer = players[currentPlayerIndex];

// Oyuncuya soru sorulur ve cevap alınır
console.log(`Soru ${currentPlayer.name}'ya soruluyor...`);
const answer = await getPlayerAnswer(currentPlayer);

// Doğru cevap verildi ise skor artırılır
if (answer) {
const scoreToAdd = calculateScore(answer);
E(scorekeeperFacet).addScore(currentPlayer.name, scoreToAdd);
currentPlayer.score += scoreToAdd;
console.log(`${currentPlayer.name} doğru cevap verdi! Skoru: ${currentPlayer.score}`);
}
}

// Cevap alma fonksiyonu
const getPlayerAnswer = (player) => {
return new Promise((resolve, reject) => {
// Soru sorma işlemi
// ...

// Cevap alma işlemi
// ...
const answer = getAnswerFromPlayer(player);

resolve(answer);
});
};

// Skor hesaplama fonksiyonu
const calculateScore = (answer) => {
// Skor hesaplama işlemi
// ...
return score;
};

};

// Test amaçlı olarak başlatma fonksiyonunu çağırıyoruz
start();

Kodun başında, Far ve makeZoe fonksiyonları Agoric kütüphanesinden alınmıştır. Bu fonksiyonların yanı sıra, players adlı bir dizi tanımlanmıştır. Bu dizi, oyun için katılımcıların isimlerini ve skorlarını içerir.

Daha sonra, scoreContract adlı bir akıllı sözleşme tanımlanmıştır. Bu sözleşme, skorları takip etmek için bir arayüz sağlar. addScore fonksiyonu, belirli bir oyuncunun skorunu artırmak için kullanılabilirken, getScores fonksiyonu tüm oyuncuların skorlarını döndürmek için kullanılabilir.

Ardından, gameContract adlı bir diğer akıllı sözleşme tanımlanmıştır. Bu sözleşme, oyun yönetimi işlevi görür. Sözleşme içinde, önce makeZoe fonksiyonu kullanılarak bir Zoe örneği oluşturulur. Ardından, playerInvites dizisi oluşturulur ve her oyuncu için bir oyuncu davetiyesi oluşturulur. Daha sonra, playersSeats adlı bir dizi oluşturulur ve her oyuncu davetiyesi kabul edilir.

Sıradaki adım, scorekeeperInstallationHandle ve scorekeeperInvite değişkenleri oluşturulmasıdır. Bu değişkenler, skorlarını takip etmek için kullanılacak olan scoreContract akıllı sözleşmesinin kurulumunu ve davetiyesini temsil eder. Son olarak, scorekeeperFacet adlı bir değişken oluşturulur ve E() fonksiyonu kullanılarak bu değişken aracılığıyla skor yönetimi akıllı sözleşmesine erişilir.

Oyun döngüsü sonraki aşamada başlar. Bu döngüde, while(true) döngüsü kullanılmıştır. Oyuncuların sırayla seçildiği ve her oyuncuya soru sorulduğu bir döngüdür. Sorulan sorunun cevabı doğru ise, oyun skoru artırır ve son skor ekrana yazdırılır.

Son olarak, iki fonksiyon daha tanımlanmıştır: getPlayerAnswer ve calculateScore. Bunlar, sırasıyla bir oyuncudan cevap almak ve cevaba göre skor hesaplamak için kullanılırlar.

Kod örneği, Agoric smart contracts kullanarak basit bir oyun uygulamasının nasıl oluşturulabileceğini göstermektedir. Ancak, gerçek bir oyun uygulaması daha karmaşık olabilir ve bu kod yalnızca fikir vermek için yazılmıştır.

Zoe Framework Uygulaması

Zoe, Agoric platformunda bulunan ve akıllı sözleşmelerin güvenli bir şekilde çalışmasını sağlayan bir framework'dür. Zoe sayesinde, farklı taraflar arasında anlaşma yapmak veya varlık takası yapmak için kullanılabilen akıllı sözleşmeler oluşturabilirsiniz.

Zoe, iki temel bileşenden oluşur: garantörlük (assurance) ve ZCF (Zoe Contract Framework). Garantörlük, Zoe tarafından sağlanan bir yapıdır ve alıcı ve satıcının işlemin tamamlanması için belirli koşulları karşılaması gerektiğini doğrular. Bu sayede, işlemler daha güvenli hale gelir. ZCF ise, Zoe'nun kendisidir ve akıllı sözleşmelerin oluşturulması ve yönetilmesi için kullanılır.

Zoe, akıllı sözleşmelerin kompozisyonunu destekler. Sözleşmeler, diğer sözleşmelerle birleştirilebilir ve böylece daha karmaşık işlemler gerçekleştirilebilir. Bu özellik, Zoe'yu oldukça esnek bir çözüm haline getirir.

Zoe ile akıllı sözleşme oluşturmak için, öncelikle ZCF'yi yüklemeniz gerekir. Daha sonra, makeZoe fonksiyonunu kullanarak bir Zoe örneği oluşturabilirsiniz. Zoe, sözleşmelerin yönetimi için kullanılabilecek bir dizi farklı arayüz sağlar. Örneğin, makeInstance fonksiyonu, yeni bir akıllı sözleşme örneği oluşturmak için kullanılırken, install fonksiyonu, yeni bir sözleşmenin kurulumunu gerçekleştirir.

Zoe, alıcı ve satıcının işlemi tamamlamak için belirli koşulları karşılamalarını gerektirir. Bu koşullar, sözleşmeler tarafından tanımlanır ve örnek olarak; bir taraftan para transferinin yapılması, diğer taraftan ürün teslimatının gerçekleştirilmesini isteyebilirsiniz.

Son olarak, Zoe'nun güvenliği artırma amacıyla kullandığı bir diğer mekanizma da "statik tahsisat"tır. Bu sistemde, akıllı sözleşmede kullanılan tüm varlıklar, başlangıçta belirtilen "tahsisat" ile sınırlıdır ve daha sonra değiştirilemez. Bu sayede, herhangi bir tarafın hile yapması veya başka bir şekilde sözleşmenin işleyişini değiştirmesi engellenir.

Zoe, Agoric platformunda bulunan güçlü bir framework'dür ve akıllı sözleşmelerin güvenli bir şekilde çalışmasını sağlar. Zoe sayesinde, farklı taraflar arasında anlaşma yapmak veya varlık takası yapmak için kullanılabilen akıllı sözleşmeler oluşturabilirsiniz.